package whf.framework.security;

import java.security.Principal;
import java.util.List;
import java.util.Locale;
import java.util.Set;

import whf.framework.security.entity.Dept;
import whf.framework.security.entity.Group;
import whf.framework.security.entity.Permission;
import whf.framework.security.entity.Role;
import whf.framework.security.entity.User;
import whf.framework.web.query.Field;
import whf.framework.web.tag.ext.TableAttributes;

/**
 * @author wanghaifeng
 * @create Aug 12, 2006 11:56:13 PM
 * 用户上下文对象，当用户登陆成功后即创建，保存用户相关信息；
 * 获取UserContext的方法和规范
 * UserContext有两种方法可以获取：1、通过HttpHelper,2、通过ThreadLocalPool
 * 一般的如果是在web环境下，可以方便的获取HttpSession对象的话首先使用HttpHelper过去
 * 但是对于业务对象无法使用HttpSession获取时，使用ThreadLocalPool获取；
 */
public interface UserContext {
	public final static String USER_CONTEXT = "whf.framework.auth.UserContext";
	/**
	 * @modify wanghaifeng Aug 13, 2006 12:08:58 AM
	 * @return当前用户
	 */
	public User getUser();
	
	/**
	 * @modify wanghaifeng Aug 13, 2006 12:05:22 AM
	 * @return
	 */
	public Locale getLocale();
	
	/**
	 * @modify wanghaifeng Aug 12, 2006 11:57:32 PM
	 * @return 当前用户拥有的角色
	 */
	public Set<Role> getRoles();
	
	/**
	 * @modify wanghaifeng Aug 12, 2006 11:57:52 PM
	 * @return 当前用户所属的用户组
	 */
	public Set<Group> getGroups();
	
	/**
	 * @modify wanghaifeng Aug 12, 2006 11:58:10 PM
	 * @return 当前用户所拥有的权限
	 */
	public Set<Permission> getPermissions();
	
	/**
	 * @modify wanghaifeng Aug 12, 2006 11:57:13 PM
	 * @return 当前用户所在的sessionId
	 */
	public String getSessionId();
	
	/**
	 * @modify wanghaifeng Aug 13, 2006 12:07:50 AM
	 * @param tableId
	 * @return 根据tableId返回table的列，用户缓存
	 */
	public TableAttributes getTableAttributes(String tableId);
	
	/**
	 * @modify wanghaifeng Aug 13, 2006 12:10:54 AM
	 * 缓存列
	 * @param tableId
	 * @param columns
	 */
	public void setTableAttributes(String tableId, TableAttributes attribute);
	
	/**
	 * @param queryId
	 * @param fields
	 */
	public void setQueryFieldValues(String queryId, List<Field> fields);
	
	/**
	 * @param queryId
	 * @return
	 */
	public List<Field> getQueryFieldValues(String queryId);
	
	/**
	 * 
	 */
	public void cleanQueryFieldValues();
	
	/**
	 * 清除所有列
	 */
	public void cleanTablesAttributes();
	
	/**
	 * @modify wanghaifeng Aug 13, 2006 4:30:23 PM
	 * @return 初次登陆的时间
	 */
	public long getLoginTime();
	
	/**
	 * @modify wanghaifeng Aug 13, 2006 11:28:24 PM
	 * @return
	 */
	public String getRemoteIpAddress();
	
	/**
	 * @modify wanghaifeng Aug 14, 2006 11:56:27 PM
	 * 从匿名用户升级到登陆用户
	 * @param principal TODO
	 * @param user
	 * @param roles
	 * @throws UserContextException
	 */
	public void upgradeToUser(Principal principal, User user, Set<Role> roles) throws UserContextException;
	
	/**
	 * 当前用户是否拥有操作某功能的权限
	 * @modify wanghaifeng Aug 26, 2006 12:54:07 PM
	 * @param targetType
	 * @param func
	 * @return
	 */
	public boolean hasFunctionPermission(String targetType, String func);
	
	/**
	 * 用户是否具有某种权限
	 * @modify wanghaifeng Nov 13, 2006 10:44:56 PM
	 * @param perm
	 * @return
	 */
	public boolean hasPermission(Permission perm);
	
	/**
	 * 用户是否是超级管理员
	 * 如果用户包含一个角色名为administrator，则为超级管理员；
	 * 对于管理员，hasFunctionPermission总是true
	 * @modify wanghaifeng Sep 6, 2006 10:45:55 PM
	 * @return
	 */
	public boolean isAdministrator();
	
	/**
	 * 判定当前用户是否是一角色中成员
	 * @param roleName
	 * @return
	 */
	public boolean isMemberOfRole(String roleName);
	
	/**
	 * 充当session使用，相当于session.setAttribute,使得应用程序中可以统一管理session数据
	 * @modify wanghaifeng Jan 22, 2007 10:51:02 AM
	 * @param name
	 * @param obj
	 */
	public void setSessionObject(String key, Object val);
	
	/**
	 * 从session中获取对象值
	 * @modify wanghaifeng Jan 22, 2007 10:51:54 AM
	 * @param key
	 * @return
	 */
	public Object getSessionObject(String key);
	
	/**
	 * 删除session中的对象
	 * @modify wanghaifeng Jan 22, 2007 11:33:41 AM
	 * @param key
	 */
	public void removeSessionObject(String key);
	
	/**
	 * 获取用户票据
	 * @modify wanghaifeng Feb 2, 2007 4:55:06 PM
	 * @return
	 */
	public Principal getPrincipal();
	
	/**
	 * @return 客户端界面宽度和高度
	 */
	public int[] getClientSize();
	
	/**
	 * 设置客户端大小
	 * @param width
	 * @param height
	 */
	public void setClientSize(int width, int height);
	
	/**
	 * 用户的角色必须是管理类型的
	 * @return 当前用户可以看到有权的部门的对象
	 */
	public Set<Dept> getManagedDepts();
	
	/**
	 * @return 获取分支机构,用于决定用户的数据库源
	 */
	public String getBranch();
}
